package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTable;

import negocio.Alumno;
import negocio.AlumnoControlador;
import negocio.Asistencia;
import negocio.AsistenciaControlador;
import negocio.Cursada;
import negocio.CursadaControlador;
import negocio.Inscripcion;
import negocio.InscripcionControlador;
import negocio.Preinscripcion;
import negocio.PreinscripcionControlador;
import persistencia.AreaDAO;
import persistencia.PreinscripcionDAO;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.border.TitledBorder;

public class InscribirCursada extends JFrame {

	private JPanel contentPane;
	private JTextField vacantesTotales;
	private JTable tableBusquedaAlumnos;
	private JTable tableInscriptoPreinscripto;
	private JComboBox comboBox;
	private JLabel lblVacantesTotales;
	private JScrollPane scrollPane;
	private DefaultTableModel tmBusqueda;
	private DefaultTableModel tmInsPre;
	private ArrayList<Inscripcion> inscripciones;
	private ArrayList<Preinscripcion> preinscripciones;
	private ArrayList<Alumno> alumnos;
	private JButton btnSalir;
	private JButton btnInscribir;
	private JLabel lblVacantesDisponibles;
	private JTextField vacantesDisponibles;
	private Integer contadorInscriptos = null;
	private boolean ListaInscripcion = false;			//false creo nuevas lista inscripcion, true actualizo lista inscripciones.
	private boolean ListaPreinscripcion = false;			//false creo nuevas lista preinscripcion, true actualizo lista preinscripciones.
	private JScrollPane scrollPane_1;
	private JPanel panel_1;
	private JLabel lblDni;
	private JTextField textField;
	private JButton btnPreinscribir;
	
	
	
	
	
	/**
	 * Launch the application.
	 */
	/*public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					InscribirCursada frame = new InscribirCursada();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public InscribirCursada(Principal padre) {
		addWindowListener(new WindowAdapter() {
		public void windowClosing(WindowEvent e){
			padre.nullInscribirCursada();
			dispose();
		}
	});
		
		inscripciones = new ArrayList<Inscripcion>();
		preinscripciones = new ArrayList<Preinscripcion>();
		
		setTitle("Inscribir a Cursada");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 520, 570);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblCursadas = new JLabel("Cursada:");
		lblCursadas.setBounds(10, 14, 235, 14);
		contentPane.add(lblCursadas);
		
		comboBox = new JComboBox();
		comboBox.setBounds(260, 11, 235, 20);
		llenarCombo();
		contentPane.add(comboBox);
		
		lblVacantesDisponibles = new JLabel("Vacantes Disponibles:");
		lblVacantesDisponibles.setBounds(10, 64, 235, 14);
		
		contentPane.add(lblVacantesDisponibles);
		vacantesDisponibles = new JTextField();
		vacantesDisponibles.setEditable(false);
		contentPane.add(vacantesDisponibles);
						
		vacantesDisponibles.setBounds(260, 61, 235, 17);
		vacantesDisponibles.setColumns(10);
		
		lblVacantesTotales = new JLabel("Vacantes Totales:");
		lblVacantesTotales.setBounds(10, 39, 235, 14);
		
		contentPane.add(lblVacantesTotales);
		vacantesTotales = new JTextField();
		vacantesTotales.setEditable(false);
		contentPane.add(vacantesTotales);
		
		comboBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(contadorInscriptos == null)				// Esto es para que este vacio el JTextField hasta que no elija un curso.
					contadorInscriptos = 0;
				Cursada cursada = (Cursada)comboBox.getSelectedItem();
				vacantesTotales.setText(""+cursada.getMaxVacantes());
				vacantesDisponibles.setText(""+(cursada.getMaxVacantes()-contadorInscriptos));
				llenarTablaInsPre();
				tableBusquedaAlumnos.setModel(tmBusqueda);
				llenarTablaBusqueda();
			}
		});
		
		vacantesTotales.setBounds(260, 36, 235, 17);
		vacantesTotales.setColumns(10);
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "Busqueda Alumnos", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setBounds(4, 99, 497, 207);
		contentPane.add(panel);
		panel.setLayout(null);
		
		scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 55, 477, 105);
		panel.add(scrollPane);
		scrollPane.setViewportView(tableBusquedaAlumnos);
		tableBusquedaAlumnos = new JTable();
		
		tmBusqueda = new DefaultTableModel();
		String[] columnasAll = {"Alumnos", "DNI", "Preinscripto"};
		tmBusqueda.setColumnIdentifiers(columnasAll);
		scrollPane.setViewportView(tableBusquedaAlumnos);
		
		textField = new JTextField();
		textField.setBounds(118, 21, 270, 23);
		panel.add(textField);
		textField.setColumns(10);
		textField.setText("");
		
		JButton btnBuscar = new JButton("Buscar");
		btnBuscar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				tableBusquedaAlumnos.setModel(tmBusqueda);
				llenarTablaBusqueda();
			}
		});
		btnBuscar.setBounds(398, 21, 89, 23);
		panel.add(btnBuscar);
		
		lblDni = new JLabel("DNI:");
		lblDni.setBounds(10, 25, 100, 14);
		panel.add(lblDni);
		
		btnPreinscribir = new JButton("Preinscribir");
		btnPreinscribir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				tableBusquedaAlumnos.getColumnModel().getColumn(2).getCellEditor().stopCellEditing();
				
				Cursada cursada = (Cursada)comboBox.getSelectedItem();
				ArrayList<Preinscripcion> pre = PreinscripcionControlador.getPreinscriptos(cursada);
				if (!ListaPreinscripcion)
				{
					for (int i=0; i<tableBusquedaAlumnos.getRowCount();i++)
					{	
						
						Alumno alumno = AlumnoControlador.getAlumno((String)tableBusquedaAlumnos.getValueAt(i, 1));
						if((boolean) tableBusquedaAlumnos.getValueAt(i, 2))
						{
							Preinscripcion preinscripcion = new Preinscripcion(alumno, cursada, "preinscripto");
							PreinscripcionControlador.guardar(preinscripcion);
						}
					}
				}
				else
				{
					preinscripciones = PreinscripcionControlador.getPreinscriptos(cursada);
					
					for (int i=0; i<tableBusquedaAlumnos.getRowCount();i++)
					{
						Alumno alumno = AlumnoControlador.getAlumno((String)tableBusquedaAlumnos.getValueAt(i, 1));

						boolean borre = false;
						
						for (int j=0;j<preinscripciones.size();j++)
						{
							if (preinscripciones.get(j).getAlumno().getDni().equals(alumno.getDni()))
							{
								if (!(boolean)tableBusquedaAlumnos.getValueAt(i, 2))
								{
									PreinscripcionControlador.borrar(preinscripciones.get(j));
									borre = true;
								}
							}
						}
						
						if(!borre)
						{
							if((boolean)tableBusquedaAlumnos.getValueAt(i, 2))
							{
								Preinscripcion preinscripcion = new Preinscripcion(alumno, cursada, "preinscripto");
								PreinscripcionControlador.guardar(preinscripcion);
							}
						}	
					}
				}
				
				llenarTablaBusqueda();
			}
		});
		
		btnPreinscribir.setBounds(398, 173, 89, 23);
		panel.add(btnPreinscribir);
		
		btnSalir = new JButton("Salir");
		btnSalir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				padre.nullInscribirCursada();
				dispose();
			}
		});
		
		btnSalir.setBounds(406, 498, 89, 23);
		contentPane.add(btnSalir);
		
		btnInscribir = new JButton("Inscribir");
		btnInscribir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tableInscriptoPreinscripto.getColumnModel().getColumn(1).getCellEditor().stopCellEditing();
				Cursada cursada = (Cursada)comboBox.getSelectedItem();
				inscripciones = InscripcionControlador.getInscriptos(cursada);
				if (!ListaInscripcion)
				{
					for (int i=0; i<tableInscriptoPreinscripto.getRowCount();i++)
					{	
						if((boolean) tableInscriptoPreinscripto.getValueAt(i, 2))
						{
							Inscripcion inscripcion = new Inscripcion((Alumno)tableInscriptoPreinscripto.getValueAt(i, 1), cursada, "inscripto");
							InscripcionControlador.guardar(inscripcion);
						}
					}
				}
				else
				{
					for (int i =0; i<inscripciones.size(); i++)
					{
						Inscripcion ins = inscripciones.get(i);
						if((boolean) tableInscriptoPreinscripto.getValueAt(i, 2))
						{
							Inscripcion inscripcion = new Inscripcion((Alumno)tableInscriptoPreinscripto.getValueAt(i, 1), cursada, "inscripto");
							InscripcionControlador.guardar(inscripcion);
						}
						else if(!ins.getEstado().equals("inscripto"))
							{
								InscripcionControlador.borrar(ins);
							}
						
					}
				}

			}
		});
		
		btnInscribir.setBounds(307, 498, 89, 23);
		contentPane.add(btnInscribir);
		
		panel_1 = new JPanel();
		panel_1.setBorder(new TitledBorder(null, "Inscripciones", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel_1.setBounds(4, 317, 497, 170);
		contentPane.add(panel_1);
		panel_1.setLayout(null);
		
		scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(10, 15, 477, 144);
		panel_1.add(scrollPane_1);
		scrollPane_1.setViewportView(tableInscriptoPreinscripto);
	
		tableInscriptoPreinscripto = new JTable();
		tmInsPre = new DefaultTableModel();
		String[] columnasInsPre = {"Alumnos", "DNI", "Inscripto", "Preinscripto"};
		tmInsPre.setColumnIdentifiers(columnasInsPre);
		tableInscriptoPreinscripto.setModel(tmInsPre);
	}
	
	public void llenarCombo()
	{
		ArrayList<Cursada> cursadas = CursadaControlador.getAll();
		comboBox.removeAll();
		for(Cursada c : cursadas)
		{
			comboBox.addItem(c);
		}
	}
	
	
	/**Tabla Arriba*/
	public void llenarTablaBusqueda()
	{	
		tmBusqueda.setRowCount(0);
		Cursada cursada = (Cursada)comboBox.getSelectedItem();
		alumnos = AlumnoControlador.getAll();
		preinscripciones = PreinscripcionControlador.getPreinscriptos(cursada);
		
		if(preinscripciones.isEmpty())
		{
			for (Alumno a : alumnos)
			{
				if(a.getDni().equals(textField.getText())) 
				{
					Object[] fila = {a.getNombre()+" "+a.getApellido(), a.getDni(), false};
					tmBusqueda.addRow(fila);
				}


				else if(textField.getText().equals(""))
				{
					Object[] fila = {a.getNombre()+" "+a.getApellido(), a.getDni(), false};
					tmBusqueda.addRow(fila);
				}
			}
			tableBusquedaAlumnos.getColumnModel().getColumn(2).setCellEditor(new Celda_CheckBox());
			tableBusquedaAlumnos.getColumnModel().getColumn(2).setCellRenderer(new Render_CheckBox());
			ListaPreinscripcion = false;
		}
	
		else
		{
			for (Alumno a : alumnos)
			{
				boolean estaPreinscripto = false;
				for(int i = 0; i<preinscripciones.size(); i++)
				{
					if(preinscripciones.get(i).getAlumno().getDni().equals(a.getDni()))
						estaPreinscripto=true;
					
				}
				
				if(a.getDni().equals(textField.getText())) 
				{
					Object[] fila = {a.getNombre()+" "+a.getApellido(), a.getDni(), estaPreinscripto};
					tmBusqueda.addRow(fila);
				}


				else if(textField.getText().equals(""))
				{
					Object[] fila = {a.getNombre()+" "+a.getApellido(), a.getDni(), estaPreinscripto};
					tmBusqueda.addRow(fila);
				}
			}
			tableBusquedaAlumnos.getColumnModel().getColumn(2).setCellEditor(new Celda_CheckBox());
			tableBusquedaAlumnos.getColumnModel().getColumn(2).setCellRenderer(new Render_CheckBox());
			ListaPreinscripcion = true;
		}
	}


	/**Tabla Abajo*/
	private void llenarTablaInsPre()
	{
		tmInsPre.setRowCount(0);
		Cursada cursada = (Cursada)comboBox.getSelectedItem();
		alumnos = AlumnoControlador.getAll();
		preinscripciones = PreinscripcionControlador.getPreinscriptos(cursada);
		
		if(inscripciones.isEmpty())
		{
			for (Preinscripcion p : preinscripciones)
			{
				if(p.getCursada().getId() == cursada.getId())
				{
					Object[] fila = {p.getAlumno().getNombre()+" "+p.getAlumno().getApellido(), p.getAlumno().getDni(), false, true};
					tmInsPre.addRow(fila);
				}	
			}
			
			tableInscriptoPreinscripto.getColumnModel().getColumn(2).setCellEditor(new Celda_CheckBox());
			tableInscriptoPreinscripto.getColumnModel().getColumn(2).setCellRenderer(new Render_CheckBox());
			tableInscriptoPreinscripto.getColumnModel().getColumn(3).setCellEditor(new Celda_CheckBox());
			tableInscriptoPreinscripto.getColumnModel().getColumn(3).setCellRenderer(new Render_CheckBox());
			ListaInscripcion = false;
		}
		else
		{
			for (Preinscripcion p : preinscripciones)
			{
				boolean estaInscripto = false;
				for(int i = 0; i<inscripciones.size(); i++)
				{
					if(inscripciones.get(i).getAlumno() == p.getAlumno())
						estaInscripto=true;
				}
				if(estaInscripto) {
					Object[] fila = {p.getAlumno().getNombre()+" "+p.getAlumno().getApellido(), estaInscripto, false};
					tmInsPre.addRow(fila);
				}
				
				else {
					Object[] fila = {p.getAlumno().getNombre()+" "+p.getAlumno().getApellido(), estaInscripto, true};
					tmInsPre.addRow(fila);
				}

			}
			tableInscriptoPreinscripto.getColumnModel().getColumn(1).setCellEditor(new Celda_CheckBox());
			tableInscriptoPreinscripto.getColumnModel().getColumn(1).setCellRenderer(new Render_CheckBox());
			tableInscriptoPreinscripto.getColumnModel().getColumn(2).setCellEditor(new Celda_CheckBox());
			tableInscriptoPreinscripto.getColumnModel().getColumn(2).setCellRenderer(new Render_CheckBox());
			ListaInscripcion = true;
			
			for (Inscripcion i : inscripciones)
			{
				boolean estado = false;
				Alumno alumno = i.getAlumno();
				if(i.getEstado().equals("inscripto"))
					estado = true;
				
				Object[] fila = { alumno.getNombre() + " " + alumno.getApellido(), estado};
			}
		}
	}
}
